import 'dart:io';
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:path_provider/path_provider.dart';

/*
  文件操作
  使用第三方库
  https://pub.flutter-io.cn/packages/path_provider
  支持全部五个平台
  支持访问两个文件系统位置：

  - 临时目录：getTemporaryDirectory()
  系统可随时清除的临时目录（缓存）

  - 文档目录:getApplicationDocumentsDirectory()
  存储只有自己可以访问的文件。只有当应用程序被卸载时，系统才会清除该目录。

  - 外部存储目录：getExternalStorageDirectory()
  外部存储目录
  在iOS下调用该方法会抛出UnsupportedError异常
  而在Android下结果是android SDK中getExternalStorageDirectory的返回值。

  - 下载目录：getDownloadsDirectory()
  只支持MacOs

  还有其他目录，不同操作系统不同
 */

void main() {
  runApp(MaterialApp(
    home: Scaffold(
      appBar: AppBar(title: Text('Directory'),),
      body: Center(
        child: Column(
          children: [
            OutlinedButton(child: Text('temDir'), onPressed: (){
              tempDir();
            },),
            Divider(),
            OutlinedButton(child: Text('docDir'), onPressed: (){
              docDir();
            },),
            OutlinedButton(child: Text('externalDir'), onPressed: (){
              externalDir();
            },),
            OutlinedButton(child: Text('downloadDir'), onPressed: (){
              downloadDir();
            },),
          ],
        ),
      ),
    ),
  ));
}

void tempDir() async {
  String dir = (await getTemporaryDirectory()).path;
  print('temp dir = $dir');
}

void docDir() async {
  String dir = (await getApplicationDocumentsDirectory()).path;
  print('document dir = $dir');
}

void externalDir() async {
  String dir = (await getExternalStorageDirectory())!.path;
  print('external storage dir = $dir');
}

/*
  只支持MacOs
 */
void downloadDir() async {
  try {
    String dir = (await getDownloadsDirectory())!.path;
    print('download dir = $dir');
  } catch (e) {
    print(e);
  }
}


class FileOperationRoute extends StatefulWidget {
  FileOperationRoute({Key? key}) : super(key: key);

  @override
  _FileOperationRouteState createState() => new _FileOperationRouteState();
}

class _FileOperationRouteState extends State<FileOperationRoute> {
  late int _counter;

  @override
  void initState() {
    super.initState();
    //从文件读取点击次数
    _readCounter().then((int value) {
      setState(() {
        _counter = value;
      });
    });
  }

  Future<File> _getLocalFile() async {
    // 获取应用目录
    String dir = (await getApplicationDocumentsDirectory()).path;
    return new File('$dir/counter.txt');
  }

  Future<int> _readCounter() async {
    try {
      File file = await _getLocalFile();
      // 读取点击次数（以字符串）
      String contents = await file.readAsString();
      return int.parse(contents);
    } on FileSystemException {
      return 0;
    }
  }

  Future<Null> _incrementCounter() async {
    setState(() {
      _counter++;
    });
    // 将点击次数以字符串类型写到文件中
    await (await _getLocalFile()).writeAsString('$_counter');
  }

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: new AppBar(title: new Text('文件操作')),
      body: new Center(
        child: new Text('点击了 $_counter 次'),
      ),
      floatingActionButton: new FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: new Icon(Icons.add),
      ),
    );
  }
}